package com.sqsf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@Controller
public class MyController {
    //RequestMapping作用1 value配置请求url
    @RequestMapping("/a")
    public void a(){
        System.out.println("aaaaa");
    }

    //数据响应方式-跳转页面-直接返回字符串
    //如上方法默认返回到a.jsp 如果想跳转到其他指定页面则需要修改方法名
    //通过修改返回值为String的形式 将需要跳转页面的名称进行返回
    //会自动进行视图解析器的拼接 前缀+返回值字符串+后缀 进行页面的跳转
    @RequestMapping("/res1")
    public String res1(HttpServletRequest request){
        //因为这个方法是用于替代servlet中处理请求的方法 所以可以直接书写参数
        request.setAttribute("msg","res1 data");
        System.out.println("数据响应方式-跳转页面-直接返回字符串");
        return "a";
    }

    //对也页面跳转与数据传递 springmvc额外提供了一个工具类ModelAndView
    //使用这个工具类也可以进行页面的跳转与数据的传递
    @RequestMapping("/res2")
    public ModelAndView res2(ModelAndView mv){
        System.out.println("数据响应方式-跳转页面-返回ModelAndView对象");
        //正常我们应该自己创建ModelAndView对象
        //ModelAndView mv=new ModelAndView();
        //可以借助springMVC帮我们创建对象 方法的参数列表使用的对象 都可以交由springMVC
        //帮我们创建使用
        //添加数据
        mv.addObject("msg","res2 data");
        //设置视图
        mv.setViewName("a");
        return mv;
    }

    @RequestMapping("/res3")
    //我们需要通过注解进行标识 让其不要使用视图解析器处理 而是直接返回
    @ResponseBody
    public String res3(){
        System.out.println("数据响应方式-回写数据-直接返回字符串1");
        return "res3 url response data";
    }

    //所有写在controller中的方法 是对于servlet中对应处理请求方法的简写
    //本质 与之前在servlet中 直接返回数据是一样的

    @RequestMapping("/res4")
    public void res4(HttpServletResponse response) throws IOException {
        System.out.println("数据响应方式-回写数据-直接返回字符串2");
        //上一个方法底层可以理解为
        response.getWriter().println("res4 url response data");
    }

    //实际开发中直接返回内容字符串的场景很少 即使返回字符串也是返回json格式的字符串
    @RequestMapping(value="/res5")
    @ResponseBody
    public String res5() throws IOException {
        System.out.println("数据响应方式-回写数据-直接返回字符串3");
        //手动拼接json格式的字符串并返回
        return "{\"username\":\"zhangsan\",\"age\":18}";
    }
}
